package com.client;

import java.io.*;
import java.net.Socket;

/**
 * 这个是一个公共类，我写的两个客户端都是掉的这个方法，避免再写第二遍
 */
public class ClientPublic {

    public void  link(){
        try {
            //socket绑定地址和端口，这个和服务端的端口一样。127.0.0.1表示回环地址即本机地址
            Socket sok=new Socket("127.0.0.1",2345);
            /**
             * 底下两个类开启了多线程，是因为多线程不会堵塞，如果不是多线程的话，会堵塞接收或者发送
             * 感兴趣可以试试
             */
            new ClentRevice(sok).start();
            new ClientSend(sok).start();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}
/**
 * 发送线程
 */
class  ClentRevice extends  Thread{
    private Socket sok;

    public ClentRevice(Socket sok) {
        this.sok = sok;
    }

    @Override
    public void run() {
        try {
            //用来写入到服务度你的数据,参数2是true表示自动刷新
            PrintWriter  pw=new PrintWriter(sok.getOutputStream(),true);
            //读取控制台内容，这里不用Scanner是因为他不能提供更好的堵塞 System.in是流，可以看api
            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
            String len="";
            //读取控制台信息
            while((len=br.readLine())!=null){

                pw.println(len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

/**
 * 接收服务器传来的消息
 */
class  ClientSend extends Thread{
    private  Socket sok;

    public ClientSend(Socket sok) {
        this.sok = sok;
    }

    @Override
    public void run() {
        try {
            System.out.println("输入发送消息");
            //准备读取服务端的内容
            BufferedReader br=new BufferedReader(new InputStreamReader(sok.getInputStream()));
            String len="";
            //读取服务端的内容
            while((len=br.readLine())!=null){
                System.out.println("客户端发来的消息是:"+len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {

        }
    }
}